//
//  MMGHomePageViewModel.swift
//  MyMicroblog
//
//  Created by Mac on 17/1/7.
//  Copyright © 2017年 itcast. All rights reserved.
//

import UIKit
import SDWebImage

class MMGHomePageViewModel: NSObject {
    
    // 提供Status数组属性
    lazy var viewModelArr: [MMGStatusViewModel] = [MMGStatusViewModel]()
    
    // 提供单例方法
//    static let shared: MMGHomePageViewModel = MMGHomePageViewModel()
    
    // 获取网络数据, 提供加载结束闭包参数.主页视图控制器只用来处理数据加载逻辑,不进行任何 UI 操作
    func loadData(isPullUp: Bool, finished:@escaping (Bool,Int) -> ()){
        // 准备字段参数 max_id,since_id
        var maxID: Int64 = 0
        var sinceID: Int64 = 0
        // 判断是否为上拉刷新,为 maxID 和 sinceID 赋值
        if isPullUp {
            maxID = Int64((viewModelArr.last?.status?.idstr) ?? "0")!
            if maxID != 0 {
                maxID -= 1
            }
        }else{
            sinceID = Int64((viewModelArr.first?.status?.idstr) ?? "0")!
        }
        
        let parameters: [String : Any?] = ["access_token" : MMGUserAccountViewModel.shared.access_token, "max_id" : "\(maxID)", "since_id" : "\(sinceID)"]
        
        MMGNetworkTool.shared.request(Method: .MethodGet, urlString: urlStatuses, parameters: parameters) { (response, error) in
            
            if error != nil {
                // 获取数据失败,执行失败回调
                finished(false,0)
            }else{
                
                let dict = response as! [String : Any]
                guard let array = dict["statuses"] as? [[String : Any?]] else {
                    // 数据转换失败,执行失败回调
                    finished(false,0)
                    return
                }
                
                // 把获取的数据转换为 Status 模型
                // 遍历数组
                var tempArray: [MMGStatusViewModel] = [MMGStatusViewModel]()
                for item in array {
                
                    let statusViewModel = MMGStatusViewModel()
                    let status = MMGStatusDTO()
                    
                    // 将数组的元素通过 YYModel 加入到模型中
                    
                    status.yy_modelSet(with: item)
                    
                    // 将获取的模型赋值给 viewModel
                    statusViewModel.status = status
                    
                    // 将 viewModel 模型加入到临时数组中
                    tempArray.append(statusViewModel)
                }
                // 赋值完毕,将临时数组拷贝给数组属性
                // 判断是否为上拉刷新状态,为 viewModelArr 正确赋值
                if isPullUp {
                    self.viewModelArr = self.viewModelArr + tempArray
                }else {
                    self.viewModelArr = tempArray.count > 20 ? tempArray : (tempArray + self.viewModelArr)
                }
                // z 执行成功回调
//                finished(true,tempArray.count)
                self.cacheSingleImage(array: tempArray, finished: finished)
            }
        }
    }
    
    // 执行单张图片缓存
    private func cacheSingleImage(array: [MMGStatusViewModel], finished:@escaping (Bool, Int) -> ()) {
        // 如果数组中没有元素,则直接完成回调,不再向下执行
        if array.count == 0 {
            finished(true, 0)
            return
        }
        
        // 使用调度组,保存单张图片
        // 遍历数组
        let group = DispatchGroup()
        for viewModel in array {
            if viewModel.imageURLs?.count == 1 {
                group.enter()
                let url = URL(string: viewModel.imageURLs?.first?.wap360Str ?? "")
                SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (_, _, _, _, _) in
                    group.leave()
                })
            }
        }
        // 下载完成,执行回调
        group.notify(queue: .main, execute: {
            finished(true, array.count)
        })
    }
}








